/*
 * Classe com atributos e metodos para conexão do cliente com o servidor
 * 
 */
package cliente;

import java.io.IOException;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import view.Cliente.JanelaChat;

public class ConexaoCliente {

    private DatagramSocket socket = null;
    private static InetAddress enderecoServidor;
    private int portaServidor;
    private DatagramPacket datagrama; // pacote usado para transmitir dados
    private Receptor tReceptor; // thread responsavel por receber dados
    static String dadoRecebido;
    private ThreadAtualizaLista thread_atualiza;
    private ThreadSinal thread_sinalOn;
    
    public boolean estabeleceConexao(String addrServidor, int portaServidor) {
        try {
            socket = new DatagramSocket(12344); // porta determinada para envio 
            enderecoServidor = InetAddress.getByName(addrServidor);
            this.portaServidor = portaServidor;
            tReceptor = new Receptor();
            tReceptor.start();
        } catch (Exception exc) {
            System.err.println(exc.toString());
            return false;
        }
        return true;
    }
    
    public static InetAddress getIpServer(){
        return enderecoServidor;
    }
    
    public void criaThreadAtualiza(){
        thread_atualiza = new ThreadAtualizaLista();
        thread_atualiza.start();
    }
    
    public void criaThreadSinal(){
        thread_sinalOn = new ThreadSinal();
        thread_sinalOn.start();
    }

    public void enviaMsg(String msg) throws SocketException {

        byte[] msgToByte = new byte[msg.length()];
        msgToByte = msg.getBytes();

        datagrama = new DatagramPacket(msgToByte, msgToByte.length, enderecoServidor, portaServidor);

        try {
            socket.send(datagrama);/* método send() envia informação do datagrama */
            System.out.println("Datagrama UDP enviado com sucesso!");
        } catch (Exception exc) {
            System.err.println(exc.toString());
        }
    }


    public boolean logar(String login, String senha) {
        String msg = new String(" ...");

        try {
            enviaMsg("LOG:" + login + ":" + senha + ":");
            //System.out.println("TESTE 1");
            do{
            msg = recebeMSG();
            //System.out.println("TESTE 2");
            }while((msg.equals(""))||(msg==null));
            
            System.out.println("MSG" + msg);
            if (msg.contains("OK")) {
                return true;
            }

        } catch (Exception exc) {
            System.err.println(exc.toString());
            return false;
        }
        return false;
    }

    public boolean cadastrar(String cadastro) {
        String temp = null;
        try {
            enviaMsg(cadastro);
            temp = recebeMSG();
            System.out.println("aki"+temp);
            if (temp.contains("ERR")) {
                JOptionPane.showMessageDialog(null, "Login já cadastrado");
                return false;
            } else if (temp.contains("GOO")) {
                
                JOptionPane.showMessageDialog(null, "Cadastra realizado com sucesso");
                return true;
            }
            return false;

        } catch (SocketException ex) {
            Logger.getLogger(ConexaoCliente.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }
    
    public String recebeMSG() {
        return tReceptor.getMSG();
    }

    public void desconectar() {
        if (socket != null) {
            socket.close();
        } else {
            System.out.println("socket null");
        }
    }

    static class Receptor extends Thread {

        private DatagramSocket socket = null;
        private DatagramPacket datagrama; // pacote usado para receber dados
        private byte[] msgToByte = new byte[1024];
        private String s = ""; // guarda temporariamente a mensagem recebida
        //Thread thread = new Thread(this);

        public Receptor() throws SocketException {
            socket = new DatagramSocket(12345); // porta determinada para recebimento
        }

        public synchronized String getMSG() {
            
            while(s.equals("")){
                try {
                    wait();
                } catch (InterruptedException ex) {
                    Logger.getLogger(ConexaoCliente.class.getName()).log(Level.SEVERE, null, ex);

                } 
                }
                System.out.println("ENTROU----------------------------------");
                notifyAll();
                String temp = s;
                System.out.println("teste" + temp);
                s = "";

                return temp;
            }
        
        public synchronized String setString(String s){
            this.s = s;
            System.out.println("MUDOU S");
            if(s.startsWith("MSG")){
                JanelaChat.setMSG(s.split(":")[1]);}
            notifyAll();
            return s = s.split(":")[1];
            
        }
        public void escutaPorta() {

            try {
                datagrama = new DatagramPacket(msgToByte, msgToByte.length);
                //socket.setSoTimeout(10000); // seta tempo máximo de espera
                while (true) {
                    socket.receive(datagrama);
                    
                    String ss = setString(new String(datagrama.getData()));
                    System.out.println("O Q RECEBEU"+ss);
                    //s = new String(datagrama.getData());
                    //s = s.split(":")[1];
                    msgToByte = new byte[1024];
                    System.out.println("ConexaoCliente -> " + ss);
                    
                    //this.interrupt();
                }
            } catch (SocketTimeoutException ste) {
                System.out.println("Pacote possivelmente não recebido");

            } catch (SocketException ex) {
                Logger.getLogger(ConexaoCliente.class.getName()).log(Level.SEVERE, null, ex);

            }catch (IllegalThreadStateException ex) {
                
                Logger.getLogger(ConexaoCliente.class.getName()).log(Level.SEVERE, null, ex);
            }catch (IOException ex) {
                Logger.getLogger(ConexaoCliente.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        @Override
        public void run() {
            escutaPorta();
            //System.out.println(thread.getState());
            //thread.start();
            
        }
    }
}
